package es

import (
	"gin/esc"
	"log"
	"strconv"

	"github.com/gin-gonic/gin"
)

var es = esc.GetESClient

type IID struct {
	ID string `json:"id" uri:"id"`
}
type IUser struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
type IPage struct {
	Page     int `json:"page" query:"page"`
	PageSize int `json:"pageSize" query:"pageSize"`
}
type IUpdata struct {
	IID
	IUser
}

type Res struct {
	msg string
}

// Add godoc
// @Summary      es 添加
// @Description  api描述
// @Tags         es
// @Accept       json
// @Produce      json
// @Param        data   body  IUser  false  "添加的信息"
// @Router       /es [post]
func Add(c *gin.Context) {
	var user IUser
	err := c.ShouldBind(&user)
	if err != nil {
		log.Println(err)
	}
	res, err := es().Index().Index("gin_es").OpType("create").BodyJson(gin.H{
		"name": user.Name,
		"age":  user.Age,
	}).Refresh("true").Do(c)
	if err != nil {
		log.Println(err)
	}
	c.JSON(200, gin.H{
		"msg":  "添加文档成功",
		"data": res,
	})
}

// Find godoc
// @Summary      es 查询
// @Description  es 分页查询
// @Tags         es
// @Accept       json
// @Produce      json
// @Param        page    query     string  false  "查询的页码"
// @Param        pageSize    query     string  false  "每页数据量"
// @Router       /es [get]
func Find(c *gin.Context) {
	// 创建 term 查询条件，用于精确查询
	// termQuery := elastic.NewTermQuery("name", "zhangsan")
	var page IPage
	page.Page, _ = strconv.Atoi(c.Query("page"))
	page.PageSize, _ = strconv.Atoi(c.Query("pageSize"))
	res, err := es().Search().
		Index("gin_es"). // 设置索引名
		// Query(termQuery).          // 设置查询条件
		Sort("age", true).                     // 设置排序字段，根据 age 字段升序排序
		From((page.Page - 1) * page.PageSize). // 设置分页参数 - 起始偏移量，从第 (page.Page - 1) * page.PageSize 行记录开始
		Size(page.PageSize).                   // 设置分页参数 - 每页大小
		Do(c)                                  // 执行请求
	if err != nil {
		log.Println(err)
	}
	c.JSON(200, gin.H{
		"msg":  "查询成功",
		"data": res,
	})
}

func Set(c *gin.Context) {
	var updata IUpdata
	c.ShouldBind(&updata)
	_, err := es().
		Update().
		Index("gin_es").
		Id(updata.ID).
		Doc(gin.H{
			"name": updata.Name,
			"age":  updata.Age,
		}).
		Refresh("true").
		Do(c)
	if err != nil {
		log.Println(err)
	}
	c.JSON(200, gin.H{
		"msg": "更新文档成功",
	})
}

func Del(c *gin.Context) {
	var id IID
	c.ShouldBindUri(&id)
	res, err := es().Delete().Index("gin_es").Id(id.ID).Refresh("true").Do(c) // 删除不存在的id会报404
	// query := elastic.NewBoolQuery()
	// query.Filter(elastic.NewTermQuery("_id", id.ID))
	// res, err := es.
	// 	DeleteByQuery("gin_es").
	// 	Query(query).
	// 	Refresh("true").
	// 	Do(c)
	if err != nil {
		log.Println(err)
	}

	c.JSON(200, gin.H{
		"msg":  "删除文档成功",
		"data": res,
	})
}
